/*
 * Tactica1DefensaDerecho.java
 *
 * Created on 9 de abril de 2007, 22:35
 *
 */

package futbol.tacticas.concursantes2007.tikitaka.tactica;

import futbol.tacticas.*;
import futbol.General;
import futbol.tacticas.concursantes2007.tikitaka.tactica.Estado;
import futbol.tacticas.concursantes2007.tikitaka.tactica.Tactica1;

import java.awt.Point;

/**
 *
 * @author leamsi78
 */
public class Tactica1DefensaDerecho extends Estado {
    
    /** Creates a new instance of Tactica1DefensaDerecho */
    public Tactica1DefensaDerecho() {
    }
    
    public void Entrar(Object obj)
    {
    }
    
    public void Ejecutar(Object obj)
    {
        Tactica1 tactica = (Tactica1)obj;
        if (tactica.jugadorMasCercaBalon != tactica.DEFENSA_DERECHO)
        {
            //Mantener a los jugadores del centro del campo en una posicion relativa al balon
            if (tactica.jugadorMasCercaBalon == tactica.DEFENSA_IZQUIERDO)
            {
                
                Point defensaIzquierdo = tactica.equipo.getPosicion(tactica.DEFENSA_IZQUIERDO);
                tactica.comandos.add(new ComandoIrA(tactica.DEFENSA_DERECHO, defensaIzquierdo.x-20, defensaIzquierdo.y + 30));
            }
            else
            {
                int dX = (int)(tactica.balon.getPosicionActual().x / 5);
                int desplazamientoY = 0;
                double distanciaY = tactica.balon.getPosicionActual().getY() - tactica.jugador[tactica.MEDIO_CENTRO].getPosicion().getY();
                if (distanciaY > 40.0) 
                {
                    desplazamientoY += (int)((distanciaY - 40.0) / 2);
                    if (desplazamientoY > 50.0) desplazamientoY = 50;
                }
                if (distanciaY < -40.0)
                {
                    desplazamientoY += (int)((distanciaY + 40.0) / 2);
                    if (desplazamientoY < -50.0) desplazamientoY = -50;
                }
                tactica.comandos.add(new ComandoIrA(tactica.DEFENSA_DERECHO, -110 + dX, 30 + desplazamientoY));
            }
        }
        else
        {
            //Tenemos que ir hacia el balon y cuando estemos a menos de 10 entonces golpear el balon
            if (tactica.jugador[tactica.DEFENSA_DERECHO].cercaBalon() == false)
            {
                tactica.jugador[tactica.DEFENSA_DERECHO].irAlBalon();
            }
            else
            {
                Point posicionJugador = tactica.jugador[tactica.DEFENSA_DERECHO].getPosicion();
                Point posicionBalon = tactica.balon.getPosicionActual();
                MDouble tiempoContrario = new MDouble();
                int jugadorContrarioMasCercano = tactica.contrario.jugadorMasCercanoBola(tactica.balon, tiempoContrario);

//                if (General.getDistancia(posicionJugador.getX(), posicionJugador.getY(), posicionBalon.getX(), posicionBalon.getY()) < 10)
//                {
                if (tactica.jugador[tactica.DEFENSA_DERECHO].jugadorCerca())
                {
                    //System.out.println(" !!!!!!JUGADOR CERCA !!!!!!!!!!!");
                    tactica.jugador[tactica.DEFENSA_DERECHO].pasarA(tactica.MEDIO_DERECHO);
//                    Point posicionMedioDerecho = tactica.jugador[tactica.MEDIO_DERECHO].getPosicion();
//                    tactica.comandos.add(new ComandoGolpearBola(tactica.DEFENSA_DERECHO, posicionMedioDerecho.x, posicionMedioDerecho.y));
                }
                else
                {
                    if (posicionJugador.getX() < -100)
                    {
                        //System.out.println("Jugador contrario mas cercano " + jugadorContrarioMasCercano);
                        //System.out.println("Distancia ^2 " + Util.distancia_2(tactica.contrario.getPosicion(jugadorContrarioMasCercano), posicionBalon));
                    
                        if (Util.distancia_2(tactica.contrario.getPosicion(jugadorContrarioMasCercano), posicionBalon) < 900)
                        {
                            Point defensaIzquierdo = tactica.equipo.getPosicion(tactica.DEFENSA_IZQUIERDO);
                            Point medioCentral = tactica.equipo.getPosicion(tactica.MEDIO_CENTRO);
//                            tactica.comandos.add(new ComandoGolpearBola(tactica.DEFENSA_DERECHO, defensaIzquierdo.getX() + 5 /*20*/, defensaIzquierdo.getY()));
                            tactica.comandos.add(new ComandoGolpearBola(tactica.DEFENSA_DERECHO, medioCentral.getX(), medioCentral.getY()));
                        }
                        else
                            tactica.jugador[tactica.DEFENSA_DERECHO].llevarBalon(new Point(-90, 80));
//                            tactica.jugador[tactica.DEFENSA_DERECHO].controlBalon(new Point(-90, 100));
                    }
                    else if (posicionJugador.getX() < 30)
                        tactica.jugador[tactica.DEFENSA_DERECHO].llevarBalon(new Point(40, 80));
//                        tactica.jugador[tactica.DEFENSA_DERECHO].controlBalon(new Point(-40, 120));
                    else 
                    {
                        Point posicionMedioDerecho = tactica.jugador[tactica.MEDIO_DERECHO].getPosicion();
                        tactica.comandos.add(new ComandoGolpearBola(tactica.DEFENSA_DERECHO, posicionMedioDerecho.getX() + 5 /*20*/, posicionMedioDerecho.getY() - 5 /*3*/));
                        tactica.comandos.add(new ComandoIrA(tactica.MEDIO_DERECHO, posicionMedioDerecho.getX() + 5 /*20*/, posicionMedioDerecho.getY() - 5 /*3*/));
    //                    paseAJugador = MEDIO_IZQUIERDO;
    //                    tiempoPase = tiempo;
                        tactica.comandos.add(new ComandoIrA(tactica.DEFENSA_DERECHO, -110, 30));
                    }
                }
            }
        }
    }
    
    public void Salir(Object obj)
    {
    }
    
    public boolean Mensaje(Object obj, Mensaje mensaje)
    {
        return true;
    }
    
}
